package org.jsola.hr.service;

import com.sun.org.apache.xpath.internal.operations.Bool;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IAttendWhitelistDAO;
import org.jsola.hr.dto.AttendWhitelistAddDTO;
import org.jsola.hr.dto.AttendWhitelistUpdateDTO;
import org.jsola.hr.entity.AttendWhitelistDO;
import org.jsola.hr.query.AttendWhitelistQuery;
import org.jsola.hr.vo.AttendWhitelistListVO;
import org.jsola.hr.vo.AttendWhitelistVO;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;


/**
 * @author zhr
 */
public interface IAttendWhitelistService extends IService<IAttendWhitelistDAO, AttendWhitelistDO> {

    /**
     * 新增考勤白名单
     * @param attendWhitelistAddDTO 新增考勤白名单DTO
     * @param tokenUser 当前用户
     * @return 考勤白名单详情信息
     */
    AttendWhitelistVO save(AttendWhitelistAddDTO attendWhitelistAddDTO, TokenUser tokenUser);

    /**
     * 修改考勤白名单
     * @param attendWhitelistUpdateDTO 修改考勤白名单DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(AttendWhitelistUpdateDTO attendWhitelistUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除考勤白名单，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param attendWhitelistIds 考勤白名单id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... attendWhitelistIds);

    /**
     * 根据考勤白名单id查找
     * @param attendWhitelistId 考勤白名单id
     * @param siteId 所属站点id
     * @return 考勤白名单详情信息
     */
    AttendWhitelistVO selectById(String attendWhitelistId, String siteId);

    /**
     * 查询考勤白名单
     * @param attendWhitelistQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤白名单列表信息
     */
    List<AttendWhitelistListVO> select(AttendWhitelistQuery attendWhitelistQuery, String siteId);

    /**
    * 查询考勤白名单记录数
    * @param attendWhitelistQuery 查询条件
    * @param siteId 所属站点id
    * @return 考勤白名单记录数
    */
    int selectCount(AttendWhitelistQuery attendWhitelistQuery, String siteId);

    /**
     * 分页查询考勤白名单
     * @param attendWhitelistQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤白名单列表信息
     */
    Page<AttendWhitelistListVO> selectPage(AttendWhitelistQuery attendWhitelistQuery, String siteId);


    /**
     * 根据考勤白名单id查找
     * @param attendWhitelistId 考勤白名单id
     * @param siteId 所属站点id
     * @return 考勤白名单
     */
    AttendWhitelistDO selectDOById(String attendWhitelistId, String siteId);

    /**
     * 查询考勤白名单
     * @param attendWhitelistQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤白名单列表
     */
    List<AttendWhitelistDO> selectDO(AttendWhitelistQuery attendWhitelistQuery, String siteId);

    /**
     * 根据考勤方案ID物理删除
     *
     * @param attendPlanId
     * @param siteId
     * @return
     */
    int deleteByAttendPlanId(String attendPlanId, String siteId);

    /**
     * 是否在白名单中
     *
     * @param attendPlanId
     * @param empInfoId
     * @param siteId
     * @return
     */
    Boolean isWhitelist(String attendPlanId, String empInfoId, String siteId);

    /**
     * 是否在白名单中
     *
     * @param attendPlanId  考勤规则Id
     * @param empInfoIdList 员工Id列表
     * @param siteId        站点
     * @return 是否在白名单中
     */
    Map<String, Boolean> isWhitelist(String attendPlanId, List<String> empInfoIdList, String siteId);

    /**
     * 根据考勤规则ID逻辑删除
     *
     * @param attendPlanId 考勤规则ID
     * @param tokenUser 当前用户
     * @return
     */
    int logicDelByAttendPlanId(String attendPlanId, TokenUser tokenUser);
}


